﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.ServiceModel.Web;
using SOAPServicios.Dominio;
using SOAPServicios.Persistencia;

namespace SOAPServicios
{
    public class Lectores : ILectores
    {
        private UsuarioDAO usuarioDAO = null;
        private UsuarioDAO UsuarioDAO
        {
            get
            {
                if (usuarioDAO == null)
                    usuarioDAO = new UsuarioDAO();
                return usuarioDAO;
            }
        }
        
        public Usuario RegistrarUsuario(Usuario usuario)
        {
            try
            {
                if (usuario.DeNombre == null || usuario.DeApellido == null || usuario.NuDocumento == null || usuario.DeDireccion == null || usuario.DeDistrito == null || usuario.DeCorreo == null ||  usuario.DeNombre.Length==0 || usuario.DeApellido.Length ==0 || usuario.NuDocumento.Length == 0 || usuario.DeDireccion.Length == 0 || usuario.DeDistrito.Length == 0 || usuario.DeCorreo.Length == 0 )
                {
                    throw new WebFaultException<Error>(
                        new Error() { CodError = "BP001", MesError = "Hay datos vacios o nulos." },
                    HttpStatusCode.BadRequest);
                }
                else
                {
                    if (UsuarioDAO.BuscarxDNI(usuario) == 1)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US001", MesError = "DNI ya esta registrado." },
                            HttpStatusCode.NotAcceptable);
                    }
                    if (UsuarioDAO.BuscarxCorreo(usuario) == 1)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US002", MesError = "E-mail ya esta registrado." },
                            HttpStatusCode.NotAcceptable);
                    }
                    usuario.DeSituacion = "Activo";
                    return UsuarioDAO.Crear(usuario);
                }
            }
            catch (Exception e)
            {
                throw e;         
            }
        }

        public Usuario ObtenerUsuario(string documento, string correo)
        {
            try
            {
                if ( (documento == null || documento.Length==0)&&  (correo == null || correo.Length==0)  )
                {
                    throw new WebFaultException<Error>(
                        new Error() { CodError = "BP001", MesError = "Hay datos vacios o nulos." },
                    HttpStatusCode.BadRequest);
                }
                else
                {
                    Usuario usuarioAObtener = new Usuario()
                    {
                        NuDocumento = documento,
                        DeCorreo = correo
                    };
                    if (documento != null && documento.Length>0)
                    {
                        usuarioAObtener=UsuarioDAO.ObtenerxDNI(usuarioAObtener);
                    }
                    else
                    {
                        usuarioAObtener = UsuarioDAO.ObtenerxCorreo(usuarioAObtener);
                    }
                    if (usuarioAObtener == null)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US003", MesError = "Usuario no esta registrado." },
                            HttpStatusCode.NotFound);
                    }
                    else
                    {
                        return usuarioAObtener;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public Usuario ActualizarUsuario(Usuario usuario)
        {
            try
            {
                if (usuario.DeNombre == null || usuario.DeApellido == null || usuario.NuDocumento == null || usuario.DeDireccion == null || usuario.DeDistrito == null || usuario.DeCorreo == null || usuario.DeNombre.Length == 0 || usuario.DeApellido.Length == 0 || usuario.NuDocumento.Length == 0 || usuario.DeDireccion.Length == 0 || usuario.DeDistrito.Length == 0 || usuario.DeCorreo.Length == 0 )
                {
                    throw new WebFaultException<Error>(
                        new Error() { CodError = "BP001", MesError = "Hay datos vacios o nulos." },
                    HttpStatusCode.BadRequest);
                }
                else
                {
                    if (UsuarioDAO.BuscarxDNI(usuario) == 0)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US003", MesError = "Usuario no esta registrado." },
                            HttpStatusCode.NotFound);
                    }
                    else
                    {
                        Usuario usuarioExistente = new Usuario();
                        usuarioExistente = UsuarioDAO.ObtenerxDNI(usuario);
                        if (usuarioExistente.DeCorreo != usuario.DeCorreo)
                        {
                            if (UsuarioDAO.BuscarxCorreo(usuario) == 1)
                            {
                                throw new WebFaultException<Error>(
                                    new Error() { CodError = "US004", MesError = "E-mail pertenece a otro Usuario." },
                                    HttpStatusCode.NotAcceptable);
                            }
                        }
                        usuario.IdUsuario = usuarioExistente.IdUsuario;
                        usuario.DeSituacion = usuarioExistente.DeSituacion;
                        return UsuarioDAO.Modificar(usuario);
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public bool BloquearUsuario(string documento, string correo)
        {
            try
            {
                if ((documento == null || documento.Length == 0) && (correo == null || correo.Length == 0))
                {
                    throw new WebFaultException<Error>(
                        new Error() { CodError = "BP001", MesError = "Hay datos vacios o nulos." },
                    HttpStatusCode.BadRequest);
                }
                else
                {
                    Usuario usuarioAObtener = new Usuario()
                    {
                        NuDocumento = documento,
                        DeCorreo = correo
                    };
                    if (documento != null || documento.Length > 0)
                    {
                        usuarioAObtener = UsuarioDAO.ObtenerxDNI(usuarioAObtener);
                    }
                    else
                    {
                        usuarioAObtener = UsuarioDAO.ObtenerxCorreo(usuarioAObtener);
                    }
                    if (usuarioAObtener == null)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US003", MesError = "Usuario no esta registrado." },
                            HttpStatusCode.NotFound);
                    }
                    else
                    {
                        usuarioAObtener.DeSituacion = "No Activo";
                        UsuarioDAO.Modificar(usuarioAObtener);
                        return true;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public bool DesBloquearUsuario(string documento, string correo)
        {
            try
            {
                if ((documento == null || documento.Length == 0) && (correo == null || correo.Length == 0))
                {
                    throw new WebFaultException<Error>(
                        new Error() { CodError = "BP001", MesError = "Hay datos vacios o nulos." },
                    HttpStatusCode.BadRequest);
                }
                else
                {
                    Usuario usuarioAObtener = new Usuario()
                    {
                        NuDocumento = documento,
                        DeCorreo = correo
                    };
                    if (documento != null || documento.Length > 0)
                    {
                        usuarioAObtener = UsuarioDAO.ObtenerxDNI(usuarioAObtener);
                    }
                    else
                    {
                        usuarioAObtener = UsuarioDAO.ObtenerxCorreo(usuarioAObtener);
                    }
                    if (usuarioAObtener == null)
                    {
                        throw new WebFaultException<Error>(
                            new Error() { CodError = "US003", MesError = "Usuario no esta registrado." },
                            HttpStatusCode.NotFound);
                    }
                    else
                    {
                        usuarioAObtener.DeSituacion = "Activo";
                        UsuarioDAO.Modificar(usuarioAObtener);
                        return true;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public List<Usuario> ListarUsuarios()
        {
            return UsuarioDAO.ListarTodos().ToList();
        }
    }
}
